#!/bin/bash

# learn_bash.sh: 一个综合学习Bash编程的脚本
# 本脚本涵盖了Bash编程中常用的知识点和功能，并提供详细的示例和注释

# ======================
# 1. 获取脚本相关信息
# ======================
# 获取脚本所在目录和名称
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
SCRIPT_NAME="$(basename "$0")"
echo "脚本所在目录: $SCRIPT_DIR"
echo "脚本名称: $SCRIPT_NAME"

# ======================
# 2. 参数处理与交互
# ======================
# 检查参数是否为空并显示帮助信息
if [[ "$1" == "-h" || "$1" == "--help" ]]; then
  echo "Usage: $SCRIPT_NAME [options]"
  echo "-h, --help    显示帮助信息"
  echo "-v, --version 显示脚本版本"
  exit 0
fi

# 提示用户输入
read -p "请输入您的名字: " NAME
echo "你好, $NAME!"

# ======================
# 3. 日期与时间操作
# ======================
# 当前日期和时间
CURRENT_DATE="$(date)"
CURRENT_TIMESTAMP="$(date +%s)"
echo "当前日期和时间: $CURRENT_DATE"
echo "当前时间戳: $CURRENT_TIMESTAMP"

# ======================
# 4. 文件与目录操作
# ======================
# 检查文件或目录是否存在
FILE="example.txt"
if [[ -f "$FILE" ]]; then
  echo "文件 $FILE 存在。"
else
  echo "文件 $FILE 不存在，正在创建..."
  touch "$FILE"
fi

# 遍历当前目录中的文件
for file in *; do
  echo "找到文件: $file"
done

# ======================
# 5. 正则表达式和文本处理
# ======================
# 使用 grep 搜索
LOG_FILE="logfile.txt"
echo "This is a test log." > "$LOG_FILE"
grep "test" "$LOG_FILE"

# 使用 sed 替换文本
sed -i 's/test/example/g' "$LOG_FILE"
echo "替换后的内容:"
cat "$LOG_FILE"

# 使用 awk 格式化文本
echo -e "Name\tAge\tCity\nAlice\t30\tNew York\nBob\t25\tLos Angeles" > data.txt
awk '{print $1, $2}' data.txt

# ======================
# 6. 网络操作
# ======================
# 检查网络连接
if ping -c 1 google.com &> /dev/null; then
  echo "网络连接正常。"
else
  echo "网络连接失败。"
fi

# 使用 curl 下载文件
URL="https://example.com"
# curl -O "$URL/file.txt"
echo "示例：可以使用 curl 下载文件 $URL"

# ======================
# 7. 环境变量
# ======================
echo "当前用户: $USER"
echo "主目录: $HOME"
export MY_VAR="自定义环境变量"
echo "自定义变量值: $MY_VAR"

# ======================
# 8. 日志记录
# ======================
LOG_FILE="script.log"
echo "$(date) - INFO - 脚本运行开始" >> "$LOG_FILE"
echo "日志记录已写入 $LOG_FILE"

# ======================
# 9. 并发与进程管理
# ======================
# 使用后台任务
(sleep 5; echo "后台任务完成") &
echo "后台任务已启动。"
wait

echo "所有任务已完成。"

# ======================
# 10. 数据类型与高级操作
# ======================
# 数组操作
my_array=("元素1" "元素2" "元素3")
echo "数组中的第一个元素: ${my_array[0]}"

# 关联数组（键值对）
declare -A my_dict
my_dict["name"]="Alice"
my_dict["age"]="30"
echo "姓名: ${my_dict[name]}"
echo "年龄: ${my_dict[age]}"

# ======================
# 11. 错误处理
# ======================
set -e  # 遇到错误时退出
trap 'echo "发生错误，脚本退出"; exit 1' ERR

# ======================
# 12. 颜色与格式化输出
# ======================
RED="\033[0;31m"
GREEN="\033[0;32m"
NC="\033[0m"  # 无颜色

echo -e "${GREEN}这是绿色的成功信息${NC}"
echo -e "${RED}这是红色的错误信息${NC}"

# ======================
# 13. 定时任务
# ======================
echo "使用 crontab 添加定时任务示例:"
echo "0 * * * * /path/to/$SCRIPT_NAME" | crontab -

# ======================
# 14. 多线程/多进程任务
# ======================
echo -e "task1\ntask2\ntask3" | xargs -n 1 -P 3 -I {} bash -c 'echo {}'

# ======================
# 15. 动态菜单与交互界面
# ======================
select option in "选项1" "选项2" "退出"; do
  case $option in
    "选项1") echo "你选择了选项1" ;;
    "选项2") echo "你选择了选项2" ;;
    "退出") break ;;
    *) echo "无效选择" ;;
  esac
done

# ======================
# 脚本结束
# ======================
echo "学习 Bash 脚本编程到此结束！"

